package reporter

import (
	"github.com/gin-gonic/gin"
	"github.com/gookit/validate"
	"strconv"
	"xkginweb/commons/response"
	context2 "xkginweb/model/context"
	resp "xkginweb/model/entity/comms/response"
	"xkginweb/model/entity/reporter"
	"xkginweb/model/entity/reporter/request"
	"xkginweb/utils/adr"
)

// 定义api接口
type ReporterApi struct{}

func (api *ReporterApi) CreateReporter(c *gin.Context) {
	// 1: 第一件事情就准备数据的载体
	var reporter reporter.QccReporter
	err := c.ShouldBindJSON(&reporter)
	if err != nil {
		// 如果参数注入失败或者出错就返回接口调用这。出错了.
		response.FailWithMessage(err.Error(), c)
		return
	}
	// 密码加密
	reporter.Password = adr.Md5(reporter.Password)

	// 创建实例，保存报修人员
	err = ReporterService.CreateReporter(&reporter)
	// 如果保存失败。就返回创建失败的提升
	if err != nil {
		response.FailWithMessage("创建失败", c)
		return
	}
	// 如果保存成功，就返回创建创建成功
	response.Ok("创建成功", c)
}

func (api *ReporterApi) UpdateReporter(c *gin.Context) {
	// 1: 第一件事情就准备数据的载体
	var reporter reporter.QccReporter
	err := c.ShouldBindJSON(&reporter)
	if err != nil {
		// 如果参数注入失败或者出错就返回接口调用这。出错了.
		response.FailWithMessage(err.Error(), c)
		return
	}

	err = ReporterService.UpdateReporter(&reporter)
	// 如果保存失败。就返回创建失败的提升
	if err != nil {
		response.FailWithMessage("更新失败", c)
		return
	}
	// 如果保存成功，就返回创建创建成功
	response.Ok("更新成功", c)
}

// 根据ID查询报修人员明细

func (api *ReporterApi) GetReporter(c *gin.Context) {
	// 绑定参数用来获取/:id这个方式
	id := c.Param("id")
	// 开始执行
	parseUint, _ := strconv.ParseUint(id, 10, 64)

	data, err := ReporterService.GetReporter(uint(parseUint))
	if err != nil {
		response.FailWithMessage("获取失败", c)
		return
	}

	response.Ok(data, c)
}

// http://localhost:8888/reporter/delete/:id

func (api *ReporterApi) DeleteById(c *gin.Context) {
	// 绑定参数用来获取/:id这个方式
	id := c.Param("id")
	// 开始执行
	parseUint, _ := strconv.ParseUint(id, 10, 64)
	err := ReporterService.DeleteReporterById(uint(parseUint))
	if err != nil {
		response.FailWithMessage("删除失败", c)
		return
	}
	response.Ok("ok", c)
}

func (api *ReporterApi) GetReporterDetail(c *gin.Context) {
	// 绑定参数用来获取/:id这个方式
	id := c.Param("id")
	// 这个是用来获取?age=123
	//age := c.Query("age")
	parseUint, _ := strconv.ParseUint(id, 10, 64)
	data, err := ReporterService.GetReporter(uint(parseUint))
	if err != nil {
		response.FailWithMessage("获取失败", c)
		return
	}
	response.Ok(data, c)
}

func (api *ReporterApi) LoadReporterPage(c *gin.Context) {
	// 创建一个分页对象
	var pageInfo request.ReporterPageInfo
	// 把前端json的参数传入给PageInfo
	err := c.ShouldBindJSON(&pageInfo)
	if err != nil {
		response.FailWithMessage(err.Error(), c)
		return
	}

	reporterPage, total, err := ReporterService.LoadReporterPage(pageInfo)
	if err != nil {
		response.FailWithMessage("获取失败"+err.Error(), c)
		return
	}
	response.Ok(resp.PageResult{
		List:     reporterPage,
		Total:    total,
		Page:     pageInfo.Page,
		PageSize: pageInfo.PageSize,
	}, c)
}

func (api *ReporterApi) LoadReporter(c *gin.Context) {
	// 创建一个分页对象
	var info request.ReporterInfo
	// 把前端json的参数传入给PageInfo
	err := c.ShouldBindJSON(&info)
	if err != nil {
		response.FailWithMessage(err.Error(), c)
		return
	}

	reporter, err := ReporterService.LoadReporter(info)
	if err != nil {
		response.FailWithMessage("获取失败"+err.Error(), c)
		return
	}
	response.Ok(reporter, c)
}

// 管理员修改用户的密码

func (api *ReporterApi) UpdatePwd(c *gin.Context) {
	// 1: 接受用户输入的密码和确认密码 和 还要当前操作的用户id
	reporterPwdContext := context2.ReporterPwdContext{}
	err := c.ShouldBindJSON(&reporterPwdContext)
	if err != nil {
		response.FailWithError(err, c)
		return
	}

	// 服务端开始验证
	v := validate.Struct(reporterPwdContext)
	if !v.Validate() {
		response.FailWithValidatorData(v, c)
		return
	}

	// 2: 然后根据用户id查询是否存在。
	reporterInfo, _ := ReporterService.GetReporter(reporterPwdContext.ReporterId)
	if reporterInfo.ReporterId == 0 {
		// 5 : 如果不存在，操作不合法,查无此用户信息
		response.FailWithMessage("操作不合法,查无此用户信息", c)
		return
	}

	// 针对性的去更新和处理
	var newReporter = reporter.QccReporter{}
	newReporter.ReporterId = reporterInfo.ReporterId
	newReporter.Password = adr.Md5(reporterPwdContext.Password)
	// 4 : 如果存在 就把slat和 旧密码都修改掉
	err = ReporterService.UpdateReporter(&newReporter)
	if err != nil {
		response.FailWithError(err, c)
		return
	}
	//5： 如果没有数据返回，直接返回成功就用OkSuccess
	response.OkSuccess(c)
}
